package com.yadong.pattern.creational.builder;

/**
 * 建造者模式
 * 定义:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示
 * 特征:用户只需指定需要建造的类型就可以得到它们,建造过程和细节不需要知道
 * 类型:创建型
 * 适用场景:
 *         1.如果一个对象有非常复杂的内部结构(很多属性字段)
 *         2.想把复杂对象的创建和使用分离
 * 优点:
 *      1.封装性好,创建和使用分离。
 *      2.扩展性好,建造类之间独立,一定程度上解耦
 * 缺点:
 *      1.产生多余的Builder对象。
 *      2.产品内部发生变化,建造者都要修改,成本比较大
 *
 * 个人理解
 *      1.简单来说,建造者模式就是如何一步一步构建一个包含多个组件的对象,相同的构建过程可以创建不同的产品.
 *        适用于流程固定,但是顺序不一定固定的。
 *      2.对象的建造过程和细节不需要知道,但是我们也可以创建出来复杂的对象。
 *      3.举个例子,做一盘菜,做菜的构建过程相对复杂,有的人喜欢先放盐,有的人喜欢后放盐,但是放盐这个组件是一定要加的。
 */
public class TestBuilder {

    /**
     * 步骤5:客户端调用-创建武林隐士高手
     * 背景:打游戏想创建一个武林大侠
     * 目的:希望通过建造者模式去创建
     */
    public static void test() {
        Person person = Person.builder()
                .setName("风清扬")
                .setAge(99)
                .setKungFu("独孤九剑")
                .build();
        System.out.println(person.toString());
    }
}
